package com.tyut.musicdreamer.service.music.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tyut.musicdreamer.service.music.model.dto.MusicCreateRequest;
import com.tyut.musicdreamer.service.music.model.dto.MusicQueryRequest;
import com.tyut.musicdreamer.service.music.model.dto.MusicUpdateRequest;
import com.tyut.musicdreamer.service.music.model.dto.MusicUploadRequest;
import com.tyut.musicdreamer.service.music.model.entity.Music;
import com.tyut.musicdreamer.service.music.model.vo.MusicVO;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 音乐服务接口
 */
public interface MusicService extends IService<Music> {

    /**
     * 上传音乐
     *
     * @param request 上传请求
     * @param userId 用户ID
     * @return 音乐信息
     */
    MusicVO upload(MusicUploadRequest request, Long userId);
    
    /**
     * 上传音乐（Controller调用的方法）
     *
     * @param file 音乐文件
     * @param request 创建请求
     * @return 音乐信息
     */
    MusicVO uploadMusic(MultipartFile file, MusicCreateRequest request);
    
    /**
     * 创建音乐（Controller调用的方法）
     *
     * @param request 创建请求
     * @return 音乐信息
     */
    MusicVO createMusic(MusicCreateRequest request);
    
    /**
     * 更新音乐（Controller调用的方法）
     *
     * @param request 更新请求
     * @return 音乐信息
     */
    MusicVO updateMusic(MusicUpdateRequest request);

    /**
     * 获取音乐详情
     *
     * @param id 音乐ID
     * @param userId 当前用户ID，可为null
     * @return 音乐详情
     */
    MusicVO getDetail(String id, Long userId);
    
    /**
     * 获取音乐详情（Controller调用的方法）
     *
     * @param id 音乐ID
     * @return 音乐详情
     */
    MusicVO getMusicById(String id);

    /**
     * 分页查询音乐列表
     *
     * @param request 查询请求
     * @param userId 当前用户ID，可为null
     * @return 分页结果
     */
    Page<MusicVO> queryPage(MusicQueryRequest request, Long userId);
    
    /**
     * 分页查询音乐列表（Controller调用的方法）
     *
     * @param request 查询请求
     * @return 分页结果
     */
    Page<MusicVO> pageMusicList(MusicQueryRequest request);
    
    /**
     * 获取用户音乐列表（Controller调用的方法）
     *
     * @param userId 用户ID
     * @return 音乐列表
     */
    List<MusicVO> getMusicListByUserId(Long userId);
    
    /**
     * 查询用户收藏的音乐列表
     *
     * @param request 查询请求
     * @param userId 用户ID
     * @param favoriteIds 收藏的音乐ID列表
     * @return 分页结果
     */
    Page<MusicVO> queryFavoriteMusics(MusicQueryRequest request, Long userId, List<String> favoriteIds);
    
    /**
     * 流式播放音乐（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void streamMusic(String id, HttpServletResponse response) throws IOException;
    
    /**
     * 下载音乐（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void downloadMusic(String id, HttpServletResponse response) throws IOException;
    
    /**
     * 获取音乐封面（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void getMusicCover(String id, HttpServletResponse response) throws IOException;

    /**
     * 上传音乐封面（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param file 封面文件
     * @param userId 用户ID
     * @throws IOException IO异常
     */
    void uploadMusicCover(String id, MultipartFile file, Long userId) throws IOException;

    /**
     * 播放音乐
     *
     * @param id 音乐ID
     * @return 是否成功
     */
    boolean play(String id);
    
    /**
     * 记录播放（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean recordPlay(String id, Long userId);

    /**
     * 点赞音乐
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean like(String id, Long userId);
    
    /**
     * 点赞音乐（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean likeMusic(String id, Long userId);

    /**
     * 取消点赞
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean cancelLike(String id, Long userId);
    
    /**
     * 取消点赞（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean unlikeMusic(String id, Long userId);

    /**
     * 收藏音乐
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean favorite(String id, Long userId);
    
    /**
     * 收藏音乐（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean favoriteMusic(String id, Long userId);

    /**
     * 取消收藏
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean cancelFavorite(String id, Long userId);
    
    /**
     * 取消收藏（Controller调用的方法）
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean unfavoriteMusic(String id, Long userId);

    /**
     * 获取用户收藏的音乐列表（Controller调用的方法）
     *
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果
     */
    Page<MusicVO> getUserFavorites(Long userId, Integer pageNum, Integer pageSize);

    /**
     * 删除音乐
     *
     * @param id 音乐ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteMusic(String id, Long userId);
    
    /**
     * 获取预签名URL
     *
     * @param objectKey 对象键
     * @param expirationMinutes 过期时间（分钟）
     * @return 预签名URL
     */
    String getPresignedUrl(String objectKey, Integer expirationMinutes);

    /**
     * 获取随机音乐列表（Controller调用的方法）
     *
     * @param count 获取数量
     * @param userId 用户ID
     * @return 音乐列表
     */
    List<MusicVO> getRandomMusic(Integer count, Long userId);
} 